package main

import (
	"errors"
	"fmt"
	"os"
)

//使用结构体管理队列
type Queue struct {
	maxSize int
	array   [4]int //数组 ==》模拟队列
	front   int    //表示指向队列的首位
	rear    int    // 表示指向队列的尾部
}

//向尾部添加数据
func (q *Queue) AddQueue(val int) (err error) {
	//先判断队列是否已满
	if q.rear == q.maxSize-1 { //重要的提示，rear是队列尾部（包含对列尾）
		return errors.New("queue full")
	}
	q.rear++
	q.array[q.rear] = val
	return err
}

//从队列中取出数据
func (q *Queue) GetQueue() (val int, err error) {
	//先判断队列是否为空
	if q.rear == q.front { //队列为空
		return -1, errors.New("queue empty")
	}
	q.front++
	val = q.array[q.front]
	return val, err
}

//显示队列，找到队首，遍历到队尾
func (q *Queue) ShowQueue() {
	for i := q.front + 1; i < q.rear+1; i++ {
		fmt.Printf("arr[%d]=%d\n", i, q.array[i])
	}
}

func main() {
	q := &Queue{
		maxSize: 4,
		array:   [4]int{},
		front:   -1,
		rear:    -1,
	}
	//err := q.AddQueue(2)
	//fmt.Println(err)
	//q.ShowQueue()
	var key string
	var val int
	for {
		fmt.Println("1、输入add，表示添加数据到队列")
		fmt.Println("1、输入get，表示获取数据到队列")
		fmt.Println("1、输入show，表示展示数据到队列")
		fmt.Println("1、输入exit，表示退出")
		fmt.Scanln(&key)

		switch key {
		case "add":
			fmt.Println("输入你要入队列的数据")
			fmt.Scanln(&val)
			err := q.AddQueue(val)
			if err != nil {
				fmt.Println(err)
			}
		case "get":
			val, err := q.GetQueue()
			if err != nil {
				fmt.Println("err,", err)
			} else {
				fmt.Println("队列中取出的数据为:", val)
			}

		case "show":
			fmt.Println("当前队列的数据")
			q.ShowQueue()
		case "exit":
			os.Exit(0)

		}
	}
}
